\documentclass[a4paper, 12pt]{article}

\usepackage[a4paper,left=2.5cm,right=2.5cm,top=2.5cm,bottom=2.5cm]{geometry}
\usepackage[utf8]{inputenc}
\usepackage[OT4]{fontenc}
\usepackage[english,polish]{babel}
\usepackage[final]{graphicx}
\usepackage{indentfirst}
\usepackage{float}
\usepackage{array}
\usepackage[format=hang,labelsep=period,labelfont={bf,small},textfont=small]{caption}

\usepackage{fancyhdr}
\pagestyle{fancy}
% zmiana liter w~żywej paginie na małe
\renewcommand{\sectionmark}[1]{\markboth{\thesection\ #1}{\thesection\ #1}}
\fancyhf{} % usuń bieżące ustawienia pagin
\fancyhead[R]{\small\bfseries\thepage}
\fancyhead[L]{\small\bfseries\leftmark}
\renewcommand{\headrulewidth}{0.5pt}
\renewcommand{\footrulewidth}{0pt}
\addtolength{\headheight}{0.5pt} % pionowy odstęp na kreskę
\fancypagestyle{plain}{%
\fancyhead{} % usuń p. górne na stronach pozbawionych
% numeracji (plain)
\renewcommand{\headrulewidth}{0pt} % pozioma kreska
}


\renewcommand{\baselinestretch}{1.2}
\renewcommand{\maketitle}{\begin{titlepage}
{\centering}

\thispagestyle{empty}
\noindent
 \hfill Wrocław, dn.\ \today~r.\\

\noindent
\begin{minipage}[c]{0.4\columnwidth}
  Tomasz Kaczmarzyk, 148618\\
  Krzysztof Menżyk, 148826
\end{minipage}
%\hfill
%\begin{minipage}[c]{0.4\columnwidth}
%  \begin{flushright}
%    Ocena:~\framebox{{\phantom{\large $W^1_1$$W^1_1$$W^1_1$}}}\\
%    Oddano:~\framebox{{\phantom{\large $W^1_1$$W^1_1$$W^1_1$}}}\\
% \end{flushright}
%\end{minipage}

\vspace*{5cm}
\begin{center}
  \begin{LARGE}
    \textsc{System głosowania przez SMS oparty o system operacyjny Symbian oraz J2EE}
  \end{LARGE}\\
\emph{Internet w gospodarce - projekt}
\end{center}

\begin{center}
  Rok akad. 2009/2010, kierunek: INF, specjalność: INT
\end{center}
\vspace{3cm}
\begin{flushright}
\begin{minipage}[t]{0.45\columnwidth}
\noindent
PROWADZĄCY:\\
dr inż. Tomasz Walkowiak
\end{minipage}
\end{flushright}

\vspace*{2cm}

\pagestyle{empty}
\newpage
\tableofcontents

\end{titlepage}%

}
\begin{document}

\thispagestyle{empty}
\maketitle

\pagestyle{fancy}
\section{Wstęp}
\label{sec:wstep}

Projekt składa się z dwóch modułów działających na wspólnej bazie danych.

Pierwszy moduł działa na urządzeniu z systemem operacyjnym Symbian i pełni rolę bramki sms.

Druga część projektu to aplikacja webowa napisana w J2EE służąca do zarządzania bazą danych oraz do oglądania wyników głosowania na wykresach.

\begin{figure}[h]
 \centering \includegraphics[scale=0.5]{schemat}
 \caption{Schemat działania systemu}
\end{figure}

\section{Symbian}
\label{sec:symbian}

\subsection{Instalacja środowiska}
Aby rozpocząć pracę z systemem Symbian należy zainstalować 2 podstawowe aplikacje: IDE oraz SDK.

\subsubsection{IDE (\emph{Carbide C++})}
W pierwszej kolejności należy zainstalować środowisko programistyczne \emph{Carbide C++}. Jest to środowisko oparte na popularnym \emph{Eclipse}. Wszystkie pliki potrzebne do instalacji ww. środowiska znajdują się na CD w katalogu \texttt{symbian/instalki/carbide\_cpp}. Więcej informacji można znaleźć pod adresem \cite{carbide}.

\subsubsection{SDK (\emph{3rd Edition, Maintenance Release})}
Do zainstalowanego środowiska instaluje się jedno lub wiele SDK. W naszym projekcie skorzystaliśmy z SDK \emph{3rd Edition, Maintenance Release}. Oprócz bibliotek i źródeł potrzebnych w fazie implementacji aplikacji, znajdziemy w nim także dużo przydatnych przykładów oraz emulator o nazwie \emph{EPOC32}. Pliki instalacyjne znajdują się na CD w katalogu \texttt{symbian/instalki/sdk\_3rd\_mr}. Więcej informacji można znaleźć pod adresem \cite{sdk}.

\subsection{Aplikacja (bramka SMS)}
Aplikacja ma za zadanie odebrane SMSy przesyłać do serwera poprzez połączenie Bluetooth. Należało zatem rozwiązać kwestię odbierania smsów oraz wysyłania danych przez Bluetooth. Kod aplikacji znajduje się w katalogu \texttt{symbian/sms\_poll}. Znajduje się w nim także projekt, który można otworzyć bezpośrednio w środowisku \emph{Carbide C++}.

\subsubsection{Odbieranie SMSów}
Za odbieranie SMSów odpowiedzialna jest klasa \emph{CSMSReceiver}. Dziedziczy ona po \emph{MMsvSessionObserver}, która to klasa jest  serwerem wiadomości. W momencie wystąpienia zdarzenia (pojawienie się SMSa w skrzynce odbiorczej, wysłanie SMSa, skopiowanie itp.) wywołuje ona metodę \texttt{HandleSessionEventL} z odpowiednimi parametrami. Nasza aplikacja reagowała tylko na pojawienie się nowego SMSa w skrzynce odbiorczej. Odczytywała treść oraz nr nadawcy, usuwała wiadomość ze skrzynki i wywoływała metodę klasy odpowiedzialnej za wysyłanie danych poprzez BT.

\subsubsection{Bluetooth}
Wysyłanie danych okazało się najtrudniejszym w implementacji elementem. Komunikacja odbywa się za pomocą protokołu \emph{RFComm} i składa się z następujących części:
\begin{itemize}
 \item Wykrycie urządzeń w zasięgu
 \item Wykrycie usług na wybranym przez użytkownika urządzeniu (serwerze)
 \item Połączenie z serwerem
 \item Wysyłanie danych
\end{itemize}

Wszystkie te funkcje realizowane są przez klasę \texttt{CBTClient}. Jej klasą bazową jest \texttt{CActive}, która implementuje tzw. aktywny obiekt. Jest to mechanizm lekkich wątków i sterowany jest zdarzeniami. Za wywoływanie metod aktywnych obiektów odpowiedzialny jest \emph{Active Scheduler}, który czeka na zdarzenia i w momencie wystąpienia wywołuje handler zdarzenia aktywnego obiektu. Aktywny obiekt wywołuje funkcje asynchroniczne, które nie blokują wątku głównego.

Za wykrywanie urządzeń i łączenie się z nimi odpowiedzialna jest klasa \\\texttt{CBTServiceSearcher}, która zawiera się w klasie \texttt{CBTClient}. Implementuje ona metody: wykrywania urządzeń, usług i łączenia się z urządzeniem. Wykrywanie usługi polega na znalezieniu pierwszej dostępnej na wybranym urządzeniu. Aplikacja serwerowa, z którą łączy się telefon oferują tylko jedną usługę na porcie nr 16.

\section{Serwer}
\label{sec:serwer}
Serwer, z którym komunikuje się telefon via Bluetooth działa następująco:
\begin{itemize}
 \item Rejestruje usługę na porcie 16
 \item Oczekuje na połączenie od telefonu
 \item Gdy połączenie zostanie nawiązane, odbiera dane, obrabia je i zapisuje w bazie danych
\end{itemize}


\section{Baza danych}
\label{sec:baza-danych}

W bazie przechowywane są dane dotyczące ankiet aktualnych oraz archiwalnych (wraz z wynikami głosowania).
Do każdej niearchiwalnej ankiety przypisane są możliwe odpowiedzi, do których odnoszą się rekordy tabeli \emph{votes}. W rekordach dotyczących poszczególnych głosów zapisywany jest numer telefonu, z którego wysłano SMS.
Odpowiedzi ankiet zarchiwizowanych zawierają dodatkowe pole -- liczbę głosów, które oddano na daną odpowiedź.

\begin{figure}[H]
 \centering \includegraphics[scale=0.45]{baza1.pdf}
 \caption{Schemat bazy danych}
\end{figure}

\section{Aplikacja do zarządzania ankietami}
\label{sec:app-web}

\subsection{Pliki źródłowe}

W katalogu głównym projektu znajdują się następujące elementy:
\begin{itemize}
 \item folder \emph{src} -- zawiera pliki źródłowe klas z pakietów \emph{controller} (servlety działające w warstwie kontrolera) oraz \emph{db} (obiekty reprezentujące rekordy bazy danych -- warstwa modelu)
 \item folder \emph{etc} -- zawiera deskryptor wdrożenia \emph{web.xml} opisujący m.in. mapowanie servletów i stron JSP na adresy URL
 \item folder \emph{web} -- zawiera pliki JSP (odpowiedzialne za warstwę widoku), style CSS, pliki graficzne, bibliotekę Jquery itp.
 \item plik \emph{build.xml} -- plik konfiguracyjny dla Ant-a. Pozwala na kompilację i wdrożenie projektu -- konieczne jest ustawienie odpowiednich zmiennych zdefiniowanych na początku pliku (opisują one foldery docelowe wdrożenia oraz położenie pliku servlet-api.jar)
\end{itemize}

\subsection{Strony portalowe}

\subsubsection{/AddPoll}

\begin{itemize}
 \item na tej stronie możemy dodać nową ankietę
 \item plik \emph{web/add\_poll.jsp} generuje formularz 
 \item klasa \emph{controller.AddPoll} przetwarza wysłane formularzem dane, tworzy obiekty danych (pakiet \emph{db}), które zapisywane są do bazy danych
\end{itemize}

\subsubsection{/ListPolls}

\begin{itemize}
 \item klasa \emph{controller.ListPolls} pobiera z bazy danych informacje o ankietach, buduje odpowiednie obiekty reprezentujące rekordy (pakiet \emph{db}) i przekazuje listę obiektów do pliku JSP \emph{web/list\_polls.jsp}
 \item plik \emph{web/list\_polls.jsp} odpowiada za wyświetlenie danych w tabeli oraz utworzenie interfejsu umożliwiającego wysyłanie poniżej opisanych żądań
 \item klasa \emph{controller.GetChart} odpowiada za wygenerowanie wykresu dla wybranej ankiety (wykorzystano bibliotekę Jfreechart)
 \item klasa \emph{controller.EditPoll} przyjmuje asynchroniczne żądania (typu POST) edycji ankiety
 \item klasa \emph{controller.DeletePolls} przyjmuje asynchroniczne żądania usunięcia ankiety
 \item klasa \emph{controller.ToggleLockPoll} przyjmuje asynchroniczne żądania zablokowania/odblokowania ankiety (gdy ankieta jest zablokowana, oddawane w niej głosy nie są zapisywane do bazy danych)
 \item klasa \emph{controller.Archivizer} przyjmuje asynchroniczne żądania przeniesienia ankiety do archiwum
\end{itemize}

\subsubsection{/Archive}

\begin{itemize}
 \item klasa \emph{controller.Archive} pobiera dane z bazy i tworzy listę obiektów, którą przekazuje do warstwy widoku
 \item plik \emph{web/list\_archive.jsp} odpowiada za prezentację archiwalnych danych
 \item klasa \emph{controller.GetChart} odpowiada za wygenerowanie wykresu dla wybranej ankiety
\end{itemize}


\section{Podsumowanie i wnioski}
\label{sec:podsum-wnioski}

Symbian udostępnia API, które umożliwiło zrealizowanie przyjętych w projekcie założeń. Jest to jednak bardzo specyficzne środowisko i szczególnie na początku praca w nim nie była łatwa.

Najtrudniejsze okazało się zaimplementowanie na Symbianie komunikacji Bluetooth, ponieważ jest ona sterowana zdarzeniami i -- co za tym idzie -- trudna w debugowaniu.

Ponadto początkowo próbowaliśmy ustawić standardowy priorytet aktywnego obiektu odpowiedzialnego za komunikację, co powodowało błąd typu \emph{Kernel panic}. Konieczne było wybranie niskiego priorytetu, dzięki czemu obiekt rzadziej zajmował zasoby procesora.

\begin{thebibliography}{1}
   \bibitem{carbide} \emph{Carbide C++} \\\verb$http://www.forum.nokia.com/Tools_Docs_and_Code/Tools/IDEs/Carbide.c++/$
   \bibitem{sdk} \emph{Symbian SDK} \\\verb+http://www.forum.nokia.com/Tools_Docs_and_Code/Tools/Platforms/S60_Platform_SDKs/+
   \bibitem{symbian_wiki} \emph{Wiki społeczności deweloperów Symbian OS} \\\verb+http://developer.symbian.org/wiki+
   \bibitem{headfirst} \emph{Head First: servlets \& JSP}, Bryan Basham, Kathy Sierra, Bert Bates 
\end{thebibliography}

\end{document}